package com.demo.jzoffer2;

import com.demo.domain.ListNode;
import org.junit.Test;

/**
 * @author gy
 * @date 2023/01/12
 */
public class Test0206_02 {
    /**
     * 输入：intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
     * 输出：Reference of the node with value = 8
     * 输入解释：相交节点的值为 8 （注意，如果两个列表相交则不能为 0）。
     * 从各自的表头开始算起，链表 A 为 [4,1,8,4,5]，链表 B 为 [5,0,1,8,4,5]。
     * 在 A 中，相交节点前有 2 个节点；在 B 中，相交节点前有 3 个节点。
     *
     * 注意：
     *
     * 如果两个链表没有交点，返回 null.
     * 在返回结果后，两个链表仍须保持原有的结构。
     * 可假定整个链表结构中没有循环。
     * 程序尽量满足 O(n) 时间复杂度，且仅用 O(1) 内存。
     * @param headA
     * @param headB
     * @return
     */
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {

        if (headA == null || headB == null) return null;
        ListNode node1 = headA, node2 = headB;
        // 问题一：会不会死循环的问题  如果没有交点 两边都走完一次之后同时为null退出
        // 巧妙就巧妙在把 Null 节点当成了2个不相交链表的交点。
        // 问题二、，为什么【4，1，8，4，5】和【5，0，1，8，4，5】这两个链表不是从【1，8，4，5】开始相交吗，
        // 返回的节点应该是1才对，这是我困惑的，理解不出题目
        // 公共交点，即是一个节点。他的特征是数值和指针都相等。相交是说同一个节点，不是说节点的值一样就是同一个节点
        // 不是node.val相等的时候两个节点就是相等的，不同节点存储同一个值是完全可以的
        while (node1 != node2) {
            node1 = node1 == null ? headB : node1.next;
            node2 = node2 == null ? headA : node2.next;
        }
        return node1;
    }

    @Test
    public void m1() {
        Integer a = null;
        Integer b = 3;
        System.out.println(a = a == null ? 1 : 2);
    }

    @Test
    public void m2() {

    }

}
